<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>

// valueOf() 返回对象的原始值
// toString() 返回对象的字符串值

// var num = 123;
// obj = {a:123};
// var arr = [1,2,3];
// console.log( num.valueOf() );// 123
// console.log( num.toString() );// '123'

// console.log( obj.valueOf() );// {a:123}
// console.log( obj.toString() );// '[object Object]'

// console.log( arr.valueOf() );// [1,2,3]
// console.log( arr.toString() );// '1,2,3'

// 下列代码打印结果是什么？为什么？
// console.log( [] == ![] );// true
// 1.根据运算符优先级，先运算逻辑非
// console.log( ![] );// false
// 所以，console.log( [] == false );

// 2.当object类型和基本类型比较时，会将object类型转成基本类型
// object类型转成基本类型时，先调用valueOf方法，如果得不到基本类型值，再调用toString
// console.log( [].valueOf() );// []
// console.log( [].toString() );// ''
// 所以，console.log( '' == false );

// 3.当字符串和布尔值比较时，都转成数字类型
// console.log( Number('') );// 0
// console.log( Number(false) );// 0
// 所以，console.log( 0 == 0 );// true



var a = {
    n: 1,
    valueOf: function (){
        console.log( 'valueOf执行。。。1' );
        // return this; // 返回对象的原始值
        return this.n++;// 返回自定义值
    },
    toString: function (){
        console.log( 'toString执行。。。2' );
        // return '[object Object]'; // 返回对象的字符串值
        return this.n++;// 返回自定义值
    }
}
// console.log( a == 1 );// true
// console.log( a == 2 );// true
// console.log( a == 3 );// true
// console.log( a == 4 );// true

// 如何让下列代码返回true并执行？
if (a==1 && a==2 && a==3) {
    console.log( '如何让这里执行。。。' );
}

</script>
</body>
</html>